package reflect;

import java.io.File;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.net.URISyntaxException;
import java.util.Arrays;
import java.util.Collection;

/**
 * 自动调用与当前类所在包下所有类的main方法
 *
 * 自动调用与当前类不在同一个包下(指定一个包名)所有main方法
 */
public class ReflectDemo9 {
    public static void main(String[] args) throws URISyntaxException, ClassNotFoundException, InvocationTargetException, IllegalAccessException {
     /*   File dir = new File(
                ReflectDemo9.class.getResource(".").toURI()
        );*/
        /*
          类加载路径
          可以理解为时当前类所在顶级包的上一层，如果从源码目录看相当于java目录实际
          是所有字节码文件编译后的顶级包的上一层.target/classes这里
         */
        File dir = new File(
                ReflectDemo9.class.getClassLoader().getResource(
                        "./collection"
                ).toURI()
        );
        File[] subs = dir.listFiles(f->f.getName().endsWith(".class"));
        for (File file : subs){
            String fileName = file.getName();//获取该目录的最后一级的名字
            String className = fileName.substring(0,fileName.indexOf("."));
            Class cls = Class.forName("collection."+className);
            try {
                //获取main方法
                Method m = cls.getMethod("main", String[].class);
                //调用静态方法时，第一个参数(方法所属对象)传入null
                System.out.println("执行的是："+className+"的main方法");
            /*
                main方法的参数是一个String数组，但是直接传入String数组时他会和
                invoke第二个参数(变长参数定义)冲突,使得invoke传入的String数组
                是main的唯一实参,因此将其强转成Object，使得认定为一个实参
             */
                m.invoke(null,(Object)new String[]{});
            }catch (NoSuchMethodException e){

            }

        }

    }
}
